{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Домашнее задание к лекции «Объекты и классы. Инкапсуляция, наследование и полиморфизм»\n",
    "\n",
    "## Задание № 1. Наследование\n",
    "\n",
    "Исходя из квиза к предыдущему занятию, у нас уже есть класс преподавателей и класс студентов. Студентов пока оставим без изменения, а вот преподаватели бывают разные, поэтому теперь класс Mentor должен стать родительским классом, а от него нужно реализовать наследование классов Lecturer (лекторы) и Reviewer (эксперты, проверяющие домашние задания). Очевидно, имя, фамилия и список закрепленных курсов логично реализовать на уровне родительского класса.\n",
    "\n",
    "### Для начала создадим класс для студентов. У каждого студента должны быть следующие атрибуты класса:\n",
    "- имя (name)\n",
    "- фамилия (surname)\n",
    "- пол (gender)\n",
    "- список курсов в процессе (courses_in_progress)\n",
    "- список завершенных курсов (finished_courses)\n",
    "- оценки студегнтов (grades)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 759,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender='man'):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender\n",
    "        self.finished_courses = []\n",
    "        self.courses_in_progress = []\n",
    "        self.grades = {}\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Теперь создадим класс преподавателей\n",
    "\n",
    "Объявим класс преподавателей. У преподавателей есть закрепленный за ними список курсов (courses_attached)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 760,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Mentor:\n",
    "    def __init__(self, name, surname):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.courses_attached = [] # Это список закрепленных за преподавателем курсов. \n",
    "    # Изменяемые объекты (списки) являются общими для всех экземпляров класса, \n",
    "    # поэтому дополнительно мы его инициализировать не будем"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Реализуем наследование. \n",
    "Класс Mentor будет родительским классом, а Lecturer (лекторы) и Reviewer (эксперты, проверяющие домашние задания) будут наследовать от него имя, фамилию и список закрепленных курсов."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 761,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Lecturer(Mentor):\n",
    "    def __init__(self, name, surname):\n",
    "        super().__init__(name, surname)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 762,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Reviewer(Mentor):\n",
    "    def __init__(self, name, surname):\n",
    "        super().__init__(name, surname)\n",
    "\n",
    "    # Реализуем метод выставления оценок студентам    \n",
    "    def rate_hw(self, student, course, grade):\n",
    "        if isinstance(student, Student) and course in self.courses_attached and course in student.courses_in_progress:\n",
    "            if course in student.grades:\n",
    "                student.grades[course] += [grade]\n",
    "            else:\n",
    "                student.grades[course] = [grade]\n",
    "        else:\n",
    "            return 'Ошибка'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Создадим экземпляры классов"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 763,
   "metadata": {},
   "outputs": [],
   "source": [
    "# У нас учатся два студента\n",
    "Student_1 = Student('Boris', 'Ivanov', )\n",
    "Student_2 = Student('Julia', 'Petrova', 'woman')\n",
    "# На курсах преподают два преподавателя\n",
    "Mentor_1 = Mentor('Steve', 'Jobs')\n",
    "Mentor_2 = Mentor('Bill', 'Gates')\n",
    "# Пусть первый преподаватель будет лектором\n",
    "Lecturer_1 = Lecturer('Steve', 'Jobs')\n",
    "# Закрепим за ним два курса\n",
    "Lecturer_1.courses_attached += (['Git'])\n",
    "Lecturer_1.courses_attached += (['Python']) \n",
    "# Пусть второй преподаватель будет проверяющим\n",
    "Reviewer_1 = Reviewer('Bill', 'Gates')\n",
    "# Закрепим за ним два курса\n",
    "Reviewer_1.courses_attached += (['Python']) \n",
    "Reviewer_1.courses_attached += (['Git']) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 764,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Выставление оценки студентам\n",
    "\n",
    "# Завершенные курсы и оценки за них\n",
    "# Student_1.finished_courses += ['Git']\n",
    "# Student_1.grades['Git'] = [10, 10, 10, 10, 10]\n",
    "# Student_2.finished_courses += ['Git']\n",
    "# Student_2.grades['Git'] = [10, 8, 10, 9, 10]\n",
    "\n",
    "# Курсы в прогрессе и оценки за них\n",
    "Student_1.courses_in_progress += ['Python']\n",
    "Student_2.courses_in_progress += ['Git']\n",
    "\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 5)\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 10)\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 8)\n",
    "\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 8)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 765,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---Students---\n",
      "Имя: Boris, Фамилия: Ivanov, Пол: man\n",
      "Курс/Оценки: {'Python': [5, 10, 8]}\n",
      "Имя: Julia, Фамилия: Petrova, Пол: woman\n",
      "Курс/Оценки: {'Git': [10, 10, 8, 10]}\n",
      "---Reviewer---\n",
      "Проверяющий: Имя: Bill, Фамилия: Gates, Преподаваемый курс: ['Python', 'Git']\n",
      "---Mentors---\n",
      "Имя: Steve, Фамилия: Jobs\n",
      "Имя: Bill, Фамилия: Gates\n",
      "---Lecturer---\n",
      "Имя: Steve, Фамилия: Jobs, Преподаваемый курс: ['Git', 'Python']\n"
     ]
    }
   ],
   "source": [
    "print('---Students---')\n",
    "print(f'Имя: {Student_1.name}, Фамилия: {Student_1.surname}, Пол: {Student_1.gender}', end='\\n')\n",
    "print(f'Курс/Оценки: {Student_1.grades}')\n",
    "print(f'Имя: {Student_2.name}, Фамилия: {Student_2.surname}, Пол: {Student_2.gender}', end='\\n')\n",
    "print(f'Курс/Оценки: {Student_2.grades}')\n",
    "print('---Reviewer---')\n",
    "print(f'Проверяющий: Имя: {Reviewer_1.name}, Фамилия: {Reviewer_1.surname}, Преподаваемый курс: {Reviewer_1.courses_attached}')\n",
    "print('---Mentors---')\n",
    "print(f'Имя: {Mentor_1.name}, Фамилия: {Mentor_1.surname}')\n",
    "print(f'Имя: {Mentor_2.name}, Фамилия: {Mentor_2.surname}')\n",
    "print('---Lecturer---')\n",
    "print(f'Имя: {Lecturer_1.name}, Фамилия: {Lecturer_1.surname}, Преподаваемый курс: {Lecturer_1.courses_attached}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.7 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.7"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
